#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "head.h"
// 数据类型
#define DATA_TYPE int

//创建一个空链表
p_linklist list_Create();
//尾插
int list_tail_insert(p_linklist H, DATA_TYPE value);//head
//销毁链表
p_linklist list_free(p_linklist *H);
// 遍历链表
int list_show(p_linklist H);
//翻转
int list_reverse(p_linklist H);

int main(int argc, char const *argv[])
{
    p_linklist HEAD=NULL;
    //指定位置插入测试
    HEAD=list_Create();
     //尾插
    printf("尾插测试:1 2 3\n");
    list_tail_insert(HEAD,1);
    list_tail_insert(HEAD,2);
    list_tail_insert(HEAD,3);
   //遍历
    list_show(HEAD);

    //翻转
    printf("翻转测试\n");
    list_reverse(HEAD);
    list_show(HEAD);

   //销毁
   printf("\n");
   printf("销毁测试\n");
   list_free(&HEAD);
   list_show(HEAD);

    return 0;
}

//创建一个空链表
p_linklist list_Create()
{
    p_linklist head;
    head=(p_linklist)malloc(sizeof(Lnode));
    //判断是否分配成功
    if(head==NULL)
    {
        printf("malloc failed\n");
    }
    //头结点不用来存储数据
    head->data=0;
    head->next=NULL;
    return head;
}
//尾插  失败：-1
int list_tail_insert(p_linklist H, DATA_TYPE value)
{
    //链表是否存在
    if(H==NULL)
    {
        printf("list is error\n");//链表不存在
        return -1;
    }
    //创建一个新结点
    p_linklist newnode=(p_linklist)malloc(sizeof(Lnode));
    if(newnode==NULL)
    {
        printf("newnode malloc faild\n");//新结点创建失败
        return -1;
    }
    //将新数据给新结点
    newnode->data=value;
    newnode->next=NULL;

    //找到尾结点
    p_linklist p_head=H;
    while (p_head->next!=NULL)
    {
        p_head=p_head->next;
    }
    //此时p_head指向尾结点
    p_head->next=newnode;
    return 0;
}
// 遍历链表
int list_show(p_linklist H)
{
    //判空 判断链表是否存在
    if(H==NULL)
    {
        printf("list is error\n");
        return -1;
    }
    //因为是带头结点的单链表
    if(H->next==NULL)
    {
        printf("list is empty\n");
        return -1;
    }
    printf("遍历\n");
    //遍历
    p_linklist phead=H->next;//可以从下一个结点开始遍历
    while(phead)
    {
        printf("%d \t",phead->data);
        phead=phead->next;
    }
    printf("\n");
    return 0;

}
//链表的翻转/转置
int list_reverse(p_linklist H)
{
    //判空 判断链表是否存在
    if(H==NULL)
    {
        printf("list is error\n");
        return -1;
    }
    if(H->next==NULL)
    {
        printf("list is empty\n");
        return -1;
    }
    //只有一个结点 不需要翻转
    if(H->next->next==NULL)
    {
        return 0;
    }
    p_linklist phead=H->next,qhead=H->next->next;
    phead->next=NULL;
    while(qhead!=NULL)
    {
        phead=qhead;
        qhead=qhead->next;
        phead->next=H->next;
        H->next=phead;
    }
    return 0;
}
//销毁链表
p_linklist list_free(p_linklist *H)
{
    //链表是否为空
    if(H==NULL)
    {
        printf("list is error\n");
        return NULL;
    }
    p_linklist phead=(*H)->next,temp;
    while (phead!=NULL)
    {
        //先存起来  phead
        temp=phead;
        phead=phead->next;
        memset(temp,0,sizeof(Lnode));
        free(temp);//释放
    }
    //释放头结点
    memset((*H),0,sizeof(Lnode));
    free(*H);
    *H=NULL;
   
    return NULL;

}